\section{Sémaphores}

Afin d'éviter les problèmes dû aux sections critiques quand il s'agit d'une instruction maniant une mémoire partagée, nous utilisons des systèmes de verrous sachant qu'à la préemption on ne peut pas deviner le moment de l'execution de l'instruction.\\

Les systèmes de verrous permettent l’exécution d’une section critique à un nombre prédéfinie de threads. Dans le cadre du projet on utilise le système des \textbf{sémaphores}. Le fonctionement d'un tel système nécessite d’avoir au moins une instruction atomique. Une instruction atomique est une instruction indivisible c’est à dire que si le processeur la commence il est obligé de la terminer, mais qu'on peut obtenir en exécutant un ensemble d’autre instructions non-atomique. 

Comme la bibliothèque standard du langage C ne fournit pas d'instructions atomiques, nous avons utilisé le module \textbf{spinlock.h}.
Le spinlock est un verrou tournant basé sur l'attente actif, dans lequel un thread attend dans une boucle la libération du verrou, en le vérifiant en permanance.
Ce module fournit trois fonctions qui prend en paramètre un spinlock_t qui est une structure qui contient un entier non signé. Les trois
fonctions sont :
– spin_lock() : Prend le verrou s’il est libre sinon l’attend activement ;
– spin_trylock() : Prend le verrou s’il est libre sinon renvoie l’ancienne valeur du verrou ;
– spin_unlock() : Libère le verrou.

\subsection{Imlementation}
Un sémaphore est représenté par la structure suivante:

\begin{lstlisting}
struct Semaphore{
	spinlock_t 	spinlock;
	int 		count;
	int 		(*func)(void);
};
\end{lstlisting}

\begin{itemize}
\item count : cet attribut permet de représenter le nombre de threads auquels les sémaphores permettent de manipuler une section critique. Il est initialisé à l'initialisation de la sémaphore.
\item spinlock : Le spinlock_t permet de protéger la variable count.
\item (*func)(void) : Le pointeur sur la fonction "func" spécifie l’action à exécuter au cas où la sémaphore n’est pas libre
\end{itemize}

Les fonctions qui permettent de manipuler les sémaphores sont
\begin{lstlisting}
semaphore semaphore_create(int n, int (*func)(void));
int P(semaphore s);
int V(semaphore s);
\end{lstlisting}
La premiere fonction initialise le sémaphore. Les deux autres fonctions impléménentent les deux opérations P "Proberen" pour "Puis-je" qui décrémente count et peut donc rentrer dans la section critique,
et V "Verhogen" pour "Vas-y" du sémaphore qui incrémente count.

\subsection{Test du Sémaphore}

Afin de tester notre implementation du sémaphore On lance trois thread qui exécutent le handler \textbf{func} et qui incrémente une variable \textbf{i} à tour de rôle.